#pragma once
#include <string>
#include <cstddef> 
#include <odb/nullable.hxx>
#include <odb/core.hxx>

namespace suye
{
#pragma db object table("user")
class User {
public:
    User() {}
    // 1.用户名——新增用户——>>用户ID，昵称，密码
    User(const std::string& uid, const std::string& nickname, const std::string& password) 
        : _user_id(uid), _nickname(nickname), _password(password) {}
    // 2.手机号——新增用户——>>用户ID，手机号，随机昵称
    User(const std::string& uid, const std::string& phone) 
        : _user_id(uid), _nickname(uid), _phone(phone) {}
    
    ~User() {}

    void user_id(const std::string &val) { _user_id = val; }
    std::string user_id() { return _user_id; }

    std::string nickname() { 
        if (_nickname) return *_nickname; 
        return std::string();
    }
    void nickname(const std::string &val) { _nickname = val; }

    std::string description() { 
        if (!_description) return std::string();
        return *_description; 
    }
    void description(const std::string &val) { _description = val; }
    
    std::string password() { 
        if (!_password) return std::string();
        return *_password; 
    }
    void password(const std::string &val) { _password = val; }

    std::string phone() { 
        if (!_phone) return std::string();
        return *_phone; 
    }
    void phone(const std::string &val) { _phone = val; }

    std::string avatar_id() { 
        if (!_avatar_id) return std::string();
        return *_avatar_id; 
    }
    void avatar_id(const std::string &val) { _avatar_id = val; }

private:
    friend class odb::access;
    #pragma db id auto
    unsigned long _id;
    #pragma db type("varchar(64)") index unique
    std::string _user_id;
    #pragma db type("varchar(64)") index unique
    odb::nullable<std::string> _nickname;       // 用户昵称————不一定存在
    odb::nullable<std::string> _description;    // 用户签名————不一定存在
    #pragma db type("varchar(128)")
    odb::nullable<std::string> _password;       // 登录密码————不一定存在
    #pragma db type("varchar(64)") index unique
    odb::nullable<std::string> _phone;          // 手机号————不一定存在
    #pragma db type("varchar(64)")
    odb::nullable<std::string> _avatar_id;      // 用户头像ID————不一定存在
};
}

// odb -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time user.hxx